package com.tp2.bo.impl;

import com.tp2.bo.Oferta;
import com.tp2.dominio.Descuento;
import com.tp2.dominio.MedioDePago;
import com.tp2.dominio.Producto;
import com.tp2.dominio.TarjetaDescuento;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class OfertaMarcaCategoria extends Oferta {

    private Map<Producto, Double> productosAdheridos;
    private List<Producto> productosExcluidos;

    public OfertaMarcaCategoria() {
        super();
        productosAdheridos = new LinkedHashMap<Producto, Double>();
        productosExcluidos = new ArrayList<Producto>();
        this.setPrioridad(2);
    }

    @Override
    public List<Descuento> aplicar(List<Producto> productos, MedioDePago medioDePagoCompra, TarjetaDescuento tarjetaDescuento) {
       
    	List<Descuento> descuentosAplicados = new ArrayList<Descuento>();
        
    	for (Map.Entry<Producto, Double> productoAdherido : getProductosAdheridos().entrySet()) {
        
    		Double descuentoTotal = 0.0;
    		for (Producto producto : productos) {
            
    			if (productoAdherido.getValue() != null && productoAdherido.getKey().equals(producto) && !esExcluido(producto)
                        && esMedioDePagoValido(medioDePagoCompra) && esTarjetaDeDescuentoValida(tarjetaDescuento)) {
    				
                	Double descuentoActual = ((producto.getPrecioConDescuento()) * (productoAdherido.getValue())) / 100;
                    
                	if (descuentoActual != 0) {
                		
                		producto.setPrecioConDescuento(producto.getPrecioConDescuento() - descuentoActual);
                		descuentoTotal += descuentoActual;
                	}
                }
            }
    		
    		if(descuentoTotal != 0 )
    			descuentosAplicados.add(new Descuento(getDescripcion(), descuentoTotal));
        }

        return descuentosAplicados;
    }

    public Map<Producto, Double> getProductosAdheridos() {
        return productosAdheridos;
    }

    public void setProductosAdheridos(Map<Producto, Double> productosAdheridos) {
        this.productosAdheridos = productosAdheridos;
    }

    public List<Producto> getProductosExcluidos() {
        return productosExcluidos;
    }

    public void setProductosExcluidos(List<Producto> productosExcluidos) {
        this.productosExcluidos = productosExcluidos;
    }

    public boolean esExcluido(Producto producto) {

        if (getProductosExcluidos().size() > 0) {
            for (Producto productoExcluido : getProductosExcluidos()) {
                if (producto.equals(productoExcluido)) {
                    return true;
                }
            }
        }
        return false;
    }

    public String getDescripcion() {

        if (descripcion == null) {

            return "Descuento por Marca/Categoria";
        }

        return descripcion;

    }
}
